<?php
#!/bin/bash

/**
 * User: hzbskak
 * Date: 2020/1/9 - 14:47
 */

namespace app\admin\model;


use model\wayModel\cache\WProductCache;
use think\Loader;

/**
 * 国家城市表模型（地区）
 * Class PlAreaModel
 * @package app\admin\model
 */
class PlAreaModel extends CommonModel
{

    protected $table = 'pl_area';

    /**
     * 获取国家/城市列表
     * @date 2020年1月16日09:57:35
     * @f1 判断parent父级是否存在于携带的参数中
     * 存在parent，则说明正在进行查询
     * 判断查询条件是否为空
     *  1.如果查询条件不为空则说明 正在查询或者正在跳转页数、把携带的$data['parent']，存入session中 value为携带的参数$data
     *  2.查询条件为空（改变count、sort）则把session['parent']设置为 null
     * 携带的参数不为空则赋值给$map、参数为空去session中取
     * @f2 不存在parent 则去session中取
     * 1. session中有parent，则为之前查询过的第一次加载。把session赋值给 携带参数$data['parent']、查询条件$map['parent']
     * 如果session['parent']中有过搜索记录 sid name sname则赋值给查询条件$map
     * 2. session中没有parent，则为真正的第一次加载。把0赋值给 携带参数$data['parent']、查询条件$map['parent']
     * @f3 设置排序字段、显示条数、页码
     * @f4 接收的值繁体换简体 链表查
     * @param array $data 携带的参数
     * @return \think\Paginator
     * @throws \think\exception\DbException
     */
    public static function getAreaData( $data = [])
    {
        $pa = $data['page'] = input( 'param.page');
        if( !empty( $data['parent']) || ( isset( $data['parent']) && $data['parent'] == 0)) // 非初始化加载时
        {
            if( !empty( $data['sid']) || !empty( $data['name']) || !empty( $data['en_name'])
                || ( isset( $data['sid']) && $data['sid'] == '0')
                || ( isset( $data['name']) && $data['name'] == '0')
                || ( isset( $data['en_name']) && $data['en_name'] == '0')
                || $data['page']
            )
            { // 当使用查询时 || 跳转页数时
                session( $data['parent'], $data);
            }
            else
            { // 没有查询时（改变count、sort），
                if( isset( $data['sid']) || isset( $data['name']) || isset( $data['en_name'])) // 没有查询时
                {
                    session( $data['parent'], null);
                }
            }

            $session = session( $data['parent']);

            if( isset( $data['sid'])) // 携带sid传参
            {
                if( !empty( $data['sid']) && $data['sid'] != '0') // sid为可用参数
                {
                    $map['a.id'] = [ 'eq', $data['sid']];
                    session( 'area_page', 1);
                }
            }
            elseif( isset( $session['sid']) && ( $session['sid'] || $session['sid'] == '0')) // session中取
            {
                $map['a.id'] = [ 'eq', $session['sid']];
            }

            if( isset( $data['name'])) // 携带name参数传参
            {
                if( !empty( $data['name']) || $data['name'] != 0) // name值存在
                {
                    $map['a.name'] = [ 'like', "%$data[name]%"];
                    session( 'area_page', 1);
                }
            }
            elseif( isset( $session['name']) && ( $session['name'] || $session['name'] == '0')) // session中有name
            {
                $map['a.name'] = [ 'like', "%$session[name]%"];
            }

            if( isset( $data['en_name'])) // 携带en_name传参
            {
                if( !empty( $data['en_name']) && $data['en_name'] != '0') // 进行查询
                {
                    $map['p.en_name'] = [ 'like', "%$session[en_name]%"];
                    session( 'area_page', 1);
                }
            }
            elseif( isset( $session['en_name']) && ( $session['en_name'] || $session['en_name'] == '0')) // session中取
            {
                $map['p.en_name'] = [ 'like', "%$session[en_name]%"];
            }
            $map['parent'] = $data['parent'];
        }
        else
        {
            // 第一次加载时
            if( session( 'parent') || session( 'parent') == '0') // 之前有查询过
            {
                $map['parent'] = $menu_parent = $data['parent'] = session( 'parent');
                $session2 = session( "$menu_parent");

                if( isset( $session2['sid']))
                {
                    if( $session2['sid'] || $session2['sid'] == '0')
                    {
                        $map['a.id'] = [ 'eq', $session2['sid']];
                    }
                }

                if( isset( $session2['name']))
                {
                    if( $session2['name'] || $session2['name'] == '0')
                    {
                        $map['a.name'] = [ 'like', "%$session2[name]%"];
                    }
                }

                if( isset( $session2['en_name']))
                {
                    if( $session2['en_name'] || $session2['en_name'] == '0')
                    {
                        $map['p.en_name'] = [ 'like', "%$session2[en_name]%"];
                    }
                }
            }
            else // 没有查询过，真正第一次加载时
            {
                $map['parent'] = $data['parent'] = 0;
            }
        }
        if( !empty( $data['sort']))
        {   // 携带sort排序字段
            $order = $data['sort'] . ' ' . $data['asc'];
            session( 'area_sort', $order);
            session( 'area_page', 1);
        }
        elseif ( session( 'area_sort'))
        {   // session中有sort字段
            $order = session( 'area_sort');
        }
        else
        {   // 没有设置排序字段
            $order = 'a.id'.' '. 'asc';
        }

        if( !empty( $data['count']))
        {   // 携带count值
            $count = $data['count'];
            session( 'area_count', $count);
        }
        elseif( session( 'area_count'))
        {   // session中取
            $count = session( 'area_count');
        }
        else
        {   // 默认
            $count = 10;
        }

        if( session( '?area_page'))
        {   // session中取
            $page = session( 'area_page');
        }
        else
        {
            $page = 1;
        }

        if( $pa) // 携带page
        {
            $page = $pa;
            session( 'area_page', $pa);
        }
        $map = CommonModel::fanJianConvertForAll( $map); // 繁体转简体
        $page_data = self::alias( 'a')
            ->join( 'la_public_lang P',
                " a.id = p.data_id and p.lang_type = 'pl_area/name'")
            ->field( 'a.id,a.pinyin,a.spinyin,p.hk_name as name,p.en_name,a.sort,a.is_lock,a.is_hidden,a.remark,p.data_id,a.parent,a.is_country')
            ->where( $map)
            ->where( 'is_delete', 1)
            ->order( $order)
            ->paginate( $count, false, [ 'query' => $data, 'page' => $page]);
        if( !$page_data->toArray()['data'])
        {
            $page = $page -1;
            $page_data = self::alias( 'a')
                ->join( 'la_public_lang P',
                    " a.id = p.data_id and p.lang_type = 'pl_area/name'")
                ->field( 'a.id,a.pinyin,a.spinyin,p.hk_name as name,p.en_name,a.sort,a.is_lock,a.is_hidden,a.remark,p.data_id,a.parent,a.is_country')
                ->where( $map)
                ->where( 'is_delete', 1)
                ->order( $order)
                ->paginate( $count, false, [ 'query' => $data, 'page' => $page]);
        }

        session( 'parent', $data['parent']);

        return $page_data;

    }

    /**
     * 获取下一级数据
     * @date 2020年1月16日09:58:45
     * @f1  去session查找该ID是否存在
     *  存在则把session赋值给$map
     *  不存在则把session对应的值赋值为空
     * 判断携带的page参数
     *  有：则赋值给session
     * @f2 排序
     * @f3 繁转简 链表查询
     * @param $data array 携带的参数
     * @return \think\Paginator
     * @throws \think\exception\DbException
     */
    public static function getSonData( $data)
    {
        $page = input( 'param.page');
        $map = [];

        if( session( $data['id'])) // 之前是否有搜索过
        {
            $session = session( $data['id']);
            if( isset( $session['sid']))
            {
                if( $session['sid'])
                {
                    $map['a.sid'] = [ 'eq', $session['sid']];
                }
                $map['a.name'] = [ 'like', "%$session[name]%"];
                $map['p.en_name'] = [ 'like', "%$session[en_name]%"];
            }
            else
            {
                $session['sid'] = '';
                $session['name'] = '';
                $session['en_name'] = '';
            }

            if( $page)
            {
                $session['page'] = $page;
                session( $data['id'], $session);
            }
            else
            {
                $page = $session['page'];
            }
        }

        if( session( 'area_sort'))
        {
            $order = session( 'area_sort');
        }
        else
        {
            $order = 'a.id'.' '. 'asc';
        }

        $map = CommonModel::fanJianConvertForAll( $map); // 繁体转简体
        $page_data = self::alias( 'a')
            ->join( 'la_public_lang P',
                " a.id = p.data_id and p.lang_type = 'pl_area/name'")
            ->field( 'a.id,a.pinyin,a.spinyin,p.hk_name as name,p.en_name,a.sort,a.is_lock,a.is_hidden,a.remark,p.data_id,a.parent,a.is_country')
            ->where( $map)
            ->where( 'a.parent', $data['id']) // 用当前ID与表中父ID对应去查
            ->where( 'is_delete', 1)
            ->order( $order)
            ->paginate( $data['count'], false, [ 'query' => $data, 'page' => $page]);
        if( !$page_data->toArray()['data'])
        {
            $page = $page -1;
            $page_data = self::alias( 'a')
                ->join( 'la_public_lang P',
                    " a.id = p.data_id and p.lang_type = 'pl_area/name'")
                ->field( 'a.id,a.pinyin,a.spinyin,p.hk_name as name,p.en_name,a.sort,a.is_lock,a.is_hidden,a.remark,p.data_id,a.parent,a.is_country')
                ->where( $map)
                ->where( 'a.parent', $data['id']) // 用当前ID与表中父ID对应去查
                ->where( 'is_delete', 1)
                ->order( $order)
                ->paginate( $data['count'], false, [ 'query' => $data, 'page' => $page]);
        }

        return $page_data;
    }

    /**
     * 获取上一级数据
     * @date 2020年1月16日10:06:54
     * @f1 获取当前的父ID
     * @f2 判断session中是否有f1
     *  有：把session中的值赋值给$map中
     *  没有：把查询的字段设置为空存入session中
     * @f3 排序 链表查询
     * @param $data array 携带的参数
     * @return \think\Paginator
     * @throws \think\exception\DbException
     */
    public static function getParentData( $data)
    {
        $page = input( 'param.page');
        $map = [];
        $parent = self::get( $data['id'])['parent'];
        if( session( $parent))
        {
            $session = session( $parent);
            if( isset( $session['sid']))
            {
                if( $session['sid'])
                {
                    $map['a.sid'] = [ 'eq', $session['sid']];
                }
                $map['a.name'] = [ 'like', "%$session[name]%"];
                $map['p.en_name'] = [ 'like', "%$session[en_name]%"];
            }
            else
            {
                $session['sid'] = '';
                $session['name'] = '';
                $session['en_name'] = '';
            }
        }

        if( session( 'area_sort'))
        {
            $order = session( 'area_sort');
        }
        else
        {
            $order = 'a.id' . ' ' . 'asc';
        }
        $page_data = self::alias( 'a')
            ->join( 'la_public_lang P',
                " a.id = p.data_id and p.lang_type = 'pl_area/name'")
            ->field( 'a.id,a.pinyin,a.spinyin,p.hk_name as name,p.en_name,a.sort,a.is_lock,a.is_hidden,a.remark,p.data_id,a.parent,a.is_country')
            ->where( 'a.parent', $parent) // 查询条件：用当前ID的父ID与表中父ID对应查
            ->where( 'is_delete', 1)
            ->where( $map)
            ->order( $order)
            ->paginate( $data['count'], false, [ 'query' => $data, 'page' => $page]);
        if( !$page_data->toArray()['data'])
        {
            $page = $page -1;
            $page_data = self::alias( 'a')
                ->join( 'la_public_lang P',
                    " a.id = p.data_id and p.lang_type = 'pl_area/name'")
                ->field( 'a.id,a.pinyin,a.spinyin,p.hk_name as name,p.en_name,a.sort,a.is_lock,a.is_hidden,a.remark,p.data_id,a.parent,a.is_country')
                ->where( 'a.parent', $parent) // 查询条件：用当前ID的父ID与表中父ID对应查
                ->where( 'is_delete', 1)
                ->where( $map)
                ->order( $order)
                ->paginate( $data['count'], false, [ 'query' => $data, 'page' => $page]);
        }

        return $page_data;
    }

    /**
     * 获取当前的父ID
     * @param $id int ID
     * @return mixed
     * @throws \think\exception\DbException
     */
    public static function getParentID( $id)
    {
        return self::get( $id)['parent'];
    }

    /**
     * 根据ID值获取该条信息\
     * @param $id int 地区表ID值
     * @return array|false|\PDOStatement|string|\think\Model
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public static function getAreaByID( $id)
    {
        return self::alias( 'a')
                ->join( 'la_public_lang p',
                    'a.id = p.data_id and p.lang_type = "pl_area/name"')
                ->field('a.id,a.type_id,a.is_hot,a.is_recommend,a.sname,a.pinyin,a.spinyin,p.hk_name as name,p.en_name,a.sort,a.is_lock,a.is_hidden,a.remark,p.data_id,a.parent,a.is_country,a.is_overseas')
                ->where( 'a.id', $id)
                ->find();
    }

    /**
     * 递归查询子类的ID
     * @date 2020年1月15日12:23:35
     * @f1 声明一个静态数组
     * @f2 查询下一级子类
     * @f3 f2不为空，遍历f2，且把f2中的所有id扔到f1中
     * @f4 递归该方法
     * @f5 返回f1
     * @param $id int ID
     * @return array 子类ID集
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function getChildrenID( $id)
    {
        static $arr = [];
        $area = $this->where( 'parent', $id)->where('is_delete', 1)->column('id'); // 获取下一级子类

        if( !empty( $area))
        {
            foreach ( $area as $k => $v)
            {
                $arr[] = $v;
                $this->getChildrenID( $v);
            }
        }

        return $arr;
    }

    /**
     * 新增国家/城市
     * @date 2020年1月14日17:38:32
     * @f1 验证器验证：失败返回且写入日志
     * @f2 携带的参数值转简体且携带的参数，赋值给到新数组中
     * @f3 执行添加且返回新增ID，写入日志
     * @f4 写入到语言表中
     * @f5 如果是国家，重新生成推荐国家缓存
     * @f6 重新生成搜索框默认显示的地区
     * @f7 todo:重新生成缓存
     * @f8 通过parent查询列表页显示的数据并返回
     * @param $data array
     * @return array
     * @throws \think\Exception
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     * @throws \think\exception\PDOException
     */
    public function addArea( $data)
    {
        $validate = Loader::validate( 'PlArea');
        if( $validate->batch()->check( $data) !== true)
        {   // 写入日志 并返回错误
            CommonModel::operateLog( CommonModel::getType(), '国家/城市',
                'pl_area', 0, $data, '验证未通过', 2);

            return $validate->getError();
        }

        $data = CommonModel::fanJianConvertForAll( $data); // 繁化简

        $add_data['name'] = $data['name'];
        $add_data['sname'] = $data['sname'];
        $add_data['pinyin'] = $data['pinyin'];
        $add_data['spinyin'] = $data['spinyin'];
        $add_data['remark'] = $data['remark'];
        $add_data['parent'] = $data['parent'];
        $sort = self::field("max(sort)")->value("sort");
        $add_data['sort'] = empty( $data['sort']) ? $sort + 5 : $data['sort'];
        $add_data['is_hidden'] = isset( $data['is_hidden']) ? "1" : "2";
        $add_data['is_lock'] = isset( $data['is_lock']) ? "2" : "1";
        $add_data['is_country'] = isset( $data['is_country']) ? "1" : "2";
        $add_data['is_overseas'] = isset( $data['is_overseas']) ? '1' : '2';
        $add_data['is_recommend'] = isset( $data['is_recommend']) ? 'yes' : 'no';
        $add_data['is_hot'] = isset( $data['is_hot']) ? "1" : "2";
        $add_data['type_id'] = empty( $data['areaClass']) ? "0" : $data['areaClass'];
        $add_data['profit_id'] = create_guid();
        $this->insert( $add_data); // 执行添加
        $insert_id = $this->getLastInsID();

        // 写入日志
        CommonModel::operateLog( CommonModel::getType(), '国家/城市', 'pl_area', $insert_id,
            $data, '添加成功', 1);

        if( empty( trim( $data['en_name'])))
        {
            $en_name = $data['name'];
        }
        else
        {
            $en_name = $data['en_name'];
        }

        $operate_log = CommonModel::commonLang( 'insert',
            $data['name'], $en_name, $insert_id, 'pl_area/name'); // 插入到公共语言表
        if( $operate_log !== true)
        {
            return ['msg' => $operate_log, 'code' => -1];
        }

        $cache = WProductCache::instance(); // 实例化缓存类

        if( $add_data['is_country'] == 1)
        {
            $cache->addGroomCountryCache(); // 重新生成推荐国家缓存
        }
        $cache->addAreaCache(); // 搜索框默认显示地区

        // todo:财务系统数据的插入

        if( $add_data['is_hidden'] == 2)
        {
            $hidden = 1;
        }
        else
        {
            $hidden = 3;
        }

        // 缓存的插入
        $cache->addCache( 'area', $insert_id, $hidden);
        $cache->addHotAreaCache();
        $cache->editArea( $insert_id);

        $res = $this->where( 'parent', $data['parent'])
            ->where('is_delete', 1)
            ->paginate(10);
        session( $data['parent'], null);
        session( 'area_count', null);
        session( 'area_sort', null);

        return [ 'msg' => '添加成功', 'code' => 2, 'page' => $res->lastPage()]; // 赋值总页数
    }

    /**
     * 修改国家/城市
     * @date 2020年1月15日11:57:21
     * @f1 验证器验证：失败返回且写入日志
     * @f2 携带的参数值转简体且携带的参数，赋值给到新数组中
     * @f3 执行修改写入日志
     * @f4 写入到语言表中
     * @f5 如果是国家，重新生成推荐国家缓存
     * @f6 重新生成搜索框默认显示的地区
     * @f7 todo:重新生成缓存
     * @param $data array 携带的参数
     * @param $id int ID
     * @return array
     * @throws \think\Exception
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     * @throws \think\exception\PDOException
     */
    public function editArea( $data, $id)
    {
        $validate = Loader::validate( 'PlArea');
        if( $validate->batch()->check( $data) !== true)
        {   // 写入日志 并返回错误
            CommonModel::operateLog( CommonModel::getType(), '国家/城市',
                'pl_area', 0, $data, '验证未通过', 2);

            return $validate->getError();
        }

        $data = CommonModel::fanJianConvertForAll( $data); // 繁化简

        $add_data['name'] = $data['name'];
        $add_data['sname'] = $data['sname'];
        $add_data['pinyin'] = $data['pinyin'];
        $add_data['spinyin'] = $data['spinyin'];
        $add_data['sort'] = $data['sort'];
        $add_data['remark'] = $data['remark'];
        $add_data['is_hidden'] = isset( $data['is_hidden']) ? "1" : "2";
        $add_data['is_lock'] = isset( $data['is_lock']) ? "2" : "1";
        $add_data['is_country'] = isset( $data['is_country']) ? "1" : "2";
        $add_data['is_hot'] = isset( $data['is_hot']) ? "1" : "2";
        $add_data['type_id'] = empty( $data['areaClass']) ? "0" : $data['areaClass'];
        $add_data['is_recommend'] = isset( $data['is_recommend']) ? 'yes' : 'no';
        $add_data['is_overseas'] = isset( $data['is_overseas']) ? '1' : '2';

        $old_data = PlAreaModel::get( $id)->toArray(); // 旧数据

        $this->where( 'id', $id)->update( $add_data); // 更新数据

        $operate_log = CommonModel::operateLog( CommonModel::getType(), '国家城市',
            'pl_area', $id, $old_data, '修改成功', 1); // 写入操作日志
        if( $operate_log !== true)
        {
            return ['msg' => $operate_log, 'code' => -1];
        }

        if ( empty( trim( $data['en_name'])))
        {
            $en_name = $add_data['name'];
        }
        else
        {
            $en_name = $data['en_name'];
        }

        CommonModel::commonLang( 'update',
            $add_data['name'], $en_name, $id, 'pl_area/name'); // 写入公共语言表

        $cache = WProductCache::instance(); // 实例化缓存类
        if ($add_data['is_country'] == 1)
        {
            $cache->addGroomCountryCache();
        }
        $cache->addAreaCache();

        if ( $add_data['is_hidden'] == 2)
        {
            $hidden = 1;
        }
        else
        {
            $hidden = 3;
        }

        // todo:财务系统数据的插入

        // 缓存的插入
        $cache->editCache( 'area', $id, $hidden);
        $cache->editArea( $id);
        $cache->addHotAreaCache();

        return [ 'msg' => '修改成功', 'code' => 1];

    }

    /**
     * 逻辑删除国家/城市
     * @f1 递归查询所有子类的ID集，且追加自身ID
     * @f2 执行逻辑删除
     * @f3 写入日志
     * @f4 如果有推荐国家则重新生成推荐国家缓存
     * @f5 todo:重新生成缓存
     * @date 2020年1月15日12:39:52
     * @param $id int ID
     * @return bool
     * @throws \think\Exception
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function isDeleteArea( $id)
    {
        $cache = WProductCache::instance();
        $area_id = $this->getChildrenID( $id); // 递归查询所有子类ID集
        $area_id[] = $id; // 追加自身ID


        $old_data = db('pl_area')->where('id', 'in', $area_id)
            ->select(); // 查询原数据


        $this->where('id', 'in', $area_id)
            ->update( ['is_delete' => '2', 'delete_time' => time()]); //执行逻辑删除

        $area_ids = json_encode( $area_id, JSON_UNESCAPED_UNICODE); // 序列化ID集
        CommonModel::operateLog( CommonModel::getType(), '国家/城市', 'pl_area',
            $area_ids, $old_data, '逻辑删除成功', 1); // 写入操作日志

        $is_countries = array_column( $old_data, 'is_country');
        $is_countries = array_unique( $is_countries);
        foreach ( $is_countries as $key => $value)
        {
            if( $value == "1")
            {
                $cache->addGroomCountryCache();
            }
        }
        // 缓存的插入
        $cache->addAreaCache();
        $cache->delCache( 'area', $area_id);
        $cache->addHotAreaCache();

        return true;
    }

    public function isDeleteAllArea( $data)
    {
        $cache = WProductCache::instance();

        $ids = []; // 接受所有被删除的ID集
        $old = []; // 接受所有ids的查询结果
        foreach ( $data['ids'] as $k => $v)
        {
            $area_id = $this->getChildrenID( $v); // 递归查询所有子类ID集
            $area_id[] = $v; // 追加自身ID


            $old_data = $this->where('id', 'in', $area_id)
                ->select(); // 查询原数据

            foreach ( $old_data as $key => $value)
            {
                if( $value['is_country'] == "1")
                {
                    $cache->addGroomCountryCache();
                }
            }

            $this->where('id', 'in', $area_id)
                ->update( ['is_delete' => '2', 'delete_time' => time()]); //执行逻辑删除

            $cache->delCache( 'area', $area_id);

            $ids[] = $area_id;
            $old[] = $old_data;
        }
        $old_datas = []; // 降维
        foreach ( $old as $k => $v)
        {
            foreach ( $v as $kk => $vv)
            {
                $old_datas[] = $vv;
            }
        }
        $old_data_id = array_unique( array_column( $old_datas, 'id')); // 去重复

        $od = [];
        foreach ( $old_datas as $k => $v)
        {
            foreach ( $old_data_id as $kk => $vv)
            {
                if( $k == $kk)
                {
                    $od[] = $v;
                }
            }
        }

        $old_data = json_decode( json_encode( $od),  true); // 格式化数组
        $area_ids = json_encode( $ids, JSON_UNESCAPED_UNICODE); // 序列化ID集
        CommonModel::operateLog( CommonModel::getType(), '国家/城市', 'pl_area',
            $area_ids, $old_data, '逻辑删除成功', 1); // 写入操作日志

        // 缓存的插入
        $cache->addAreaCache();
        $cache->addHotAreaCache();

        return true;
    }

    /**
     * 获取热门国家地区
     * @date 2020年1月14日09:51:10
     * @param int $limit
     * @return false|\PDOStatement|string|\think\Collection
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function getGroomCountry( $limit = 6)
    {
        return $this->field('id')
            ->where( ['is_recommend' => 'yes','is_country'=>'1',
                'is_lock' => 1, 'is_hidden' => 1, 'is_delete' => 1])
            ->order( 'sort desc')
            ->limit( $limit)
            ->select();
    }

    /**
     * 获取热门地区
     * @date 2020年1月14日16:06:30
     * @param string $limit
     * @return array|bool|false|\PDOStatement|string|\think\Collection
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function getHotArea( $limit)
    {
        return $this->field('id')
            ->where( [
                'is_hot' => 1,
                'is_lock' => 1,
                'is_hidden' => 1,
                'is_delete' => 1
            ])
            ->order('sort desc')
            ->limit( $limit)
            ->select();
    }

    /**
     * 获取地区数据
     * @date 2020年1月14日16:27:30
     * @param $id int 地区主键ID
     * @return array|false|\PDOStatement|string|\think\Model
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function getByID( $id)
    {
        return $this->alias( 'a')
            ->join( 'la_public_lang b', "a.id = b.data_id and b.lang_type='pl_area/name'")
            ->field( 'a.id,a.type_id,a.name,a.is_hot,a.is_recommend,b.hk_name,b.en_name')
            ->where( 'a.id', $id)
            ->where( 'is_delete', 1)
            ->find();
    }

    /**
     * 通过地区类型查询地区
     * @date 2020年1月14日10:39:15
     * @param $ty_id int 类型ID
     * @param $limit int 条数
     * @param $field string 查询字段
     * @return false|\PDOStatement|string|\think\Collection
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function getByTypeID( $ty_id, $limit, $field = '*')
    {
        return $this->field( "$field")
            ->where( [
            'is_lock' => 1,
            'is_hidden' => 1,
            'is_delete' => 1,
            'is_hot' => 1,
            'type_id'=> $ty_id
        ])
            ->order('sort asc')
            ->limit($limit)
            ->select();
    }

    public function getByAllChildrenIDs( $id)
    {
        $area_ids = $this
            ->where( 'parent', $id)
            ->where( 'is_delete', 1)
            ->column( 'id');

        static $ids = [];

        if( !empty( $area_ids))
        {
            foreach ( $area_ids as $k => $v)
            {
                $ids[] = $v;
                $this->getByAllChildrenIDs( $v);
            }
        }
        return $ids;
    }

}